「上次樹的題目玩了不少,今天我們再來玩一些字串相關的題目吧!」
「夏天姐,字串的題目我們不是也做過不少了嗎?解法感覺就是那一些呀」菁菁打了個哈欠,有些不耐。
「那個⋯⋯其實我自己回家也做了不少練習,字串的題目對我現在應該算是容易了」
「這樣啊⋯⋯我知道了,那今天我們來練習一些比較不同的題目吧!」
夏天打開了 10. Regular Expression Matching
兩人看著題目,研究了好一段時間,實在不知道從何下手
「這題用 Kotlin 的話,我們可以作弊一下」夏天寫出一個顯然跟題目要求不同的答案
class Solution {
fun isMatch(s: String, p: String) =
p.toRegex().matches(s)
}
「讓兩位看這一題,主要是知道有正規表達式這個工具可以使用。我們再看看下一題」夏天打開了 20. Valid Parentheses 這個題目
「嗯⋯⋯這題可以利用剛剛講的正規表達式來處理嗎」菁菁和曉欣兩人陷入苦思。
「剛好不行喔,這一題乍看之下可以用正規表達式處理,但是實際上不行,必須要用 stack 資料結構處理。」
「咦?在 Kotlin 裡面怎麼宣告 stack 呢?」
「我們可以用 ArrayDeque
來建立類似 stack 的結構」
class Solution {
fun isValid(s: String): Boolean {
val deque = ArrayDeque<Char>()
for (i in s.indices) {
val character = s[i]
println(character)
if (character == '(' || character == '[' || character == '{')
{
deque.push(character)
continue;
}
if (deque.isEmpty()) {
return false;
}
when (character) {
')' -> if (deque.getFirst() == '(') {deque.pop()} else { return false }
']' -> if (deque.getFirst() == '[') {deque.pop()} else { return false }
'}' -> if (deque.getFirst() == '{') {deque.pop()} else { return false }
else -> return false
}
}
if(!deque.isEmpty()){
return false
}
return true
}
}
「原來把字串當成像是陣列一樣使用,可以做到這種效果」曉欣說。
「沒錯」夏天說「可以用類似思路處理的題目還有 657. Robot Return to Origin 這題」
「這題我們就有辦法了!」兩人合力寫出解答
class Solution {
fun judgeCircle(moves: String): Boolean {
var x = 0
var y = 0
moves.forEach {
when (it) {
'U' -> y++
'D' -> y--
'R' -> x++
'L' -> x--
}
}
return x == 0 && y == 0
}
}
「很棒!如何?字串的題目還是有很多不簡單的吧?」
「真的,我們太小看字串的題目了!謝謝夏天姐今天的指導」
「沒事的,今天的 leetcode 題目就先這樣,先把東西吃完要緊!」